/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package semantica.tipos;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Javi
 */
public class TipoTupla extends Tipo{
            
    ArrayList <ContenidoTupla> campos;
    
    public TipoTupla (ArrayList <ContenidoTupla> c){
        this.tipo = "tupla";
        this.campos = new ArrayList<ContenidoTupla>(c);
        this.tam = tamTupla(campos);
    }
    
    private int tamTupla(ArrayList<ContenidoTupla> campos) {
        int tamTupla = 0;
        Iterator<ContenidoTupla> it = campos.iterator();
        while (it.hasNext())
            tamTupla += it.next().getTipo().tam;
        return tamTupla;
    }
    
    public ArrayList<ContenidoTupla> getCampos(){
        return campos;
    }
    
    public String muestraCampos(){
        Iterator<ContenidoTupla> it = campos.iterator();
        String s = "[ ";
        while(it.hasNext()){
            ContenidoTupla c = it.next();
            s += " <" + muestraTipo(c.getTipo()) + ", desp: " + c.getDesp() + ">,";
        }

        return s.substring(0, s.length()-1) + "]";
    }
    
    public Tipo getTipoTuplaPos(int pos){
        return campos.get(pos).getTipo();
    }
    
    public int getDespTuplaPos(int pos){
        return campos.get(pos).getDesp();
    }
    
    public boolean existeCampo(int pos){
        return pos < campos.size();
    }
    
    public String muestraTipo(Tipo tipo){
        String mostrar = "";
        String nombreTipo = tipo.getTipo();
        if (nombreTipo.equals("natural") || nombreTipo.equals("integer") || nombreTipo.equals("float") || 
                nombreTipo.equals("character") || nombreTipo.equals("boolean"))
                mostrar += ", tipo: <t: " + nombreTipo + ", tam: " + tipo.getTam();
        else if (nombreTipo.equals("array")){
              mostrar += ", tipo: <t: " + tipo.getTipo() + ", nelems: " + ((TipoArray)tipo).getNumElem()
                      + ", tbase: ";
              Tipo tb = ((TipoArray) tipo).getTipoBase();
              if (tb.getTipo().equals("ref"))
                  mostrar += "< t: ref " + ", id: " + ((TipoIdentificador)tb).getId() + ", tam: " +((TipoIdentificador)tb).getTam();
              else if (tb.getTipo().equals("array"))
                  mostrar += "< t: array , nelems: " + ((TipoArray)tb).getNumElem() + 
                              ", tbase: " + ((TipoArray)tb).getTipoBase().getTipo() + 
                              ", tam: " + ((TipoArray)tb).getTam() +
                              "> , tam: " + ((TipoArray)tipo).getTam()  ;
        } else if (tipo.getTipo().equals("tupla"))
              mostrar += " tipo: <t: " + tipo.getTipo() + ", campos:" + ((TipoTupla)tipo).muestraCampos() + ", tam: " + ((TipoTupla)tipo).getTam();   
        else if (tipo.getTipo().equals("ref")){
              mostrar += ", tipo: <t: " + tipo.getTipo() + ", id: " + ((TipoIdentificador)tipo).getId() + ", tam: " + ((TipoIdentificador)tipo).getTam();
           } 
        return mostrar;
    }
 
}